package part21;

import java.util.ArrayList;
import java.util.concurrent.*;

/**
 * @author wcj
 * @Date 2021/6/7 16:35
 * @Version 1.0
 */
public class Part214 {

    /**
     * 前面讲到的Runnable是创建一个任务，但是没有返回值
     * JDK5实现了Callable<V>接口，这个接口类似Runnable但是以Future<V>形式返回线程执行的返回值</></>
     * 第一：Callable其中执行线程的方法是call方法
     * 第二：使用Future<V>接收线程执行的返回值</>
     * 第三：需要使用ExecutorService.submit()来提交任务
     *
     * @param args
     */
    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        ArrayList<Future<String>> results = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            results.add(exec.submit(new TaskWithResult(i)));
        }
        for (Future<String> r : results) {
            try {
                System.out.println(r.get());
            } catch (InterruptedException e) {
                System.out.println(e);
                return;
            } catch (ExecutionException e) {
                exec.shutdown();
            }
        }
    }

}

class TaskWithResult implements Callable<String> {
    private int id;

    public TaskWithResult(int id) {
        this.id = id;
    }

    @Override
    public String call() throws Exception {
        return "TaskWithResult:" + id;
    }
}
